轻量级渲染管线:优化实时性
在《可编程脚本渲染管线SRP》中我们介绍了可编程渲染管线 (简称SRP)。简单的说SRP允许开发者使用C#控制Unity渲染帧的方式。在Unity 2018.1中,我们为用户提供了轻量级渲染管线(Lightweight Pipeline)和高清晰渲染管线(HD Pipleline)二个渲染管线。它们不仅可以直接使用,也可以作为开发者构建自定义渲染管线的参考。在本文中,我们将聚焦轻量级渲染管线或LW RP。
SRP演示项目,请访问Github:
https://github.com/stramit/SRPBlog/tree/master/SRP-Demo
SRP及LW RP介绍
我们希望通过将渲染管线暴露给C#,使Unity更加透明,让开发者能够显式地控制渲染过程。开发者可以使用我们提供的内置管线,从零开始开发自定义的管线,或者根据需求对现有的管线进行修改。
下面视频是对可编程渲染管线简要概述,其中包括展示了一些使用不同管线制作的短片片段:
https://v.qq.com/txp/iframe/player.html?vid=d0600yl57ao&width=500&height=375&auto=0
LW RP的目标是通过在光照和阴影方面采取一些折衷手段,优化性能受限的平台上的实时性能表现。LW RP的目标受众是那些将目标平台定位于大范围移动平台、VR,以及低实时光照需求的游戏及应用开发者。
LW RP使用一个实时阴影光源执行单程正向渲染,并逐个对象进行光照剔除,这得益于所有光照均在单程内着色完毕。传统管线正向渲染会对范围内的每个像素光源执行一次额外的绘制。与之相比,使用LW管线则会减少绘制调用的数量。相应的代价是,由于每次绘制增加的光照数量而造成的额外着色器复杂度。
Shader Graph着色器视图工具也支持LW RP,它能在着色器创作工作流程方面提供一些额外的便利。
轻量级着色器
LW RP有自己的渲染流程,因此编写相关着色器时需要谨记这点。我们开发了一组新的标准着色器(Standard Shader),位于材质的着色器下拉列表框的Lightweight Pipeline组之下。其中包括一个标准PBR(Standard PBR)着色器,一个非标准PBR(Non PBR Standard)着色器,一个标准地形(Standard Terrain)着色器,以及一个标准无光照(Standard Unlit)着色器。值得注意的是,所有Unity的现有无光照着色器都与LW RP兼容。包括传统粒子、UI、天空盒以及精灵着色器。
轻量级管线还提供了材质升级器,用于升级Unity的现存光照着色器,使之与管线兼容。要升级材质,请点击到Edit -> Render Pipeline -> Upgrade -> Lightweight。你可以选择升级项目中的所有材质或仅升级选中的材质。
材质升级器
渲染管线资源
要选择当前渲染管线,可以在Graphics Settings窗口的Scriptable Render Pipeline Settings中指定一个管线资源,或者通过脚本为GraphicsSettings.renderPipelineAsset赋值。
除了在外部通过选择一个管线为你的项目定义总体渲染方式外,还可以在同类渲染管线的不同实例中存储多个质量设定。管线资源控制全局渲染质量,负责创建管线实例。管线实例包含中间资源和渲染循环实现。
轻量级渲染
LW RP渲染功能主要是内置渲染器的一个子集。为了提升性能受限平台上的表现,故意去除了某些特定功能。Unity提供了大量的工具和技术,帮助开发者进行游戏开发。但风险是,有时可能会为某个游戏选择了不具有相应支撑资源的错误技术。提供专门的渲染管道作为模板的目的是减少用户在性能方面犯某些可能代价高昂的错误的可能性。例如在某个目标平台上部署了不合适的后期处理效果,可能会导致游戏在某个设备上运行变慢,即使Unity本身支持那些效果,而这些效果可能在合适的目标平台上运行得也不错。
实时全局光照是另一个几乎不会在LW RP的目标平台上使用的功能例子,因此也被移除。唯一支持渲染路径是单程正向渲染,这是另一个性能优先于渲染复杂度的选择。
下表详细列出了内置管线和轻量级管线分别支持的技术:
内置管线
轻量级管线
平台覆盖
所有
所有
渲染路径
多程正向
多程延迟
单程正向
光线衰减
针对点光和聚光,分别预计算的衰减纹理
顶点光照衰减在范围边界不会达到0强度
在着色器中计算衰减,平滑过渡到光照范围。对于聚光,取内外角。
色彩空间
线性,sRGB光照强度
sRGB
线性最佳,支持Gamma
线性光照强度
实时光照
定向光、聚光和点光
像素光照数量由质量设置控制
正向路径支持最多8个像素光照
支持最多4个顶点光照
定向光、聚光和点光
像素光照数量由管线资源控制
支持最多8个像素光照
支持最多4个顶点光照
光照模式
烘培
混合
间接烘培
阴影遮罩
距离阴影遮罩
减除
实时
烘培
混合
间接烘培
实时
全局光照
定向光、聚光、点光和矩形区域光
烘培
光照贴图(非定向和定向)
光照探头
实时
动态光照贴图
实时光照探头
定向光、聚光、点光和矩形区域光
烘培
光照贴图(非定向和定向)
光照探头
实时,不支持GI
光照剔除
逐对象 无计算
逐对象 无计算
着色器库
几十种非基于物理的专项着色器
统一标准PBS着色器:金属工作流程、镜面工作流程、粗糙工作流程
统一标准非基于物理的着色器(涵盖大多数传统与移动光照着色器)
统一标准着色器(金属或镜面工作流程
基于物理的着色
Disney Diffuse + Cook Torrance (GGX, Smith, Schlick) Specular
Lambertian Diffuse + Simplified Cook Torrance (GGX, Simplified KSK 和 Schlick) Specular
Lambertian Diffuse + Non-Microfaceted LUT Specular
Lambertian Diffuse + Simplified Cook Torrance (GGX, Simplified KSK 和 Schlick) Specular
光照剪影
单色
V1中不支持
光照探头模式
一个插值探头
LPPV
一个插值探头
反射探头
逐对象排序,最多混合2个探头
逐对象排序,无混合
阴影特性
PSSM Stable 和 Close Fit
过滤: PCF
无深度裁剪,在顶点完成Pancaking
PSSM Stable Fit
过滤: PCF
无深度裁剪。在顶点完成Pancaking
阴影模式
光照空间
屏幕空间
屏幕空间
阴影投射光照
定向光、聚光、点光
每周期多个阴影光照投射物
定向光和聚光
支持作为主灯光存在的单个阴影光照投射物
常规
/
/
摄像机
基于深度值排序摄像机
堆栈管理
按普通摄像机状态分组
处理摄像机之间的深度状态
基于深度值排序摄像机
无堆栈管理
支持RenderTarget缩放
游戏以缩放后的分辨率渲染
UI以原生分辨率渲染
抗锯齿
MSAA, TAA
MSAA
管线额外数据
运动向量
/
后期处理
传统的后期处理栈
新的后期处理栈
新后期处理栈特效的子集
不支持:TAA、运动模糊、SSR
调试选项
显示 GBuffer
显示不同烘焙光照视图模式
/
天空光照
程序化天空
立方体贴图/经纬贴图天空
环境光照
程序化天空
立方体贴图
环境光照
自定义轻量级管线
可编程渲染管线架构不可思议的潜力在于,它要比Unity以往的渲染方式更加开放和可定制化。如果你想访问轻量级管线的源代码,可以查看可编程渲染管线的Github页面。你可以从那里获得LW RP的C#源代码,并根据项目的需求在它的基础上创建一个新的管线。
小结
关于轻量级渲染管线就为大家介绍在这里,如果你有任何问题,欢迎访问SRP在 Github上的频道或者在Unity 官方中文论坛(Unitychina.cn)反馈给我们。
更多Unity2018.1 的信息
官方活动
活动一:Unity技术路演广州站报名启动
活动信息:3月25日(周日)广州
报名地址:https://www.bagevent.com/event/2018UnityRoadshowgz
时间:截止到3月31日 线上促销
促销地址:https://store.unity.com/cn/offer/plus-triple-boost
活动信息:5月11-13日 北京国家会议中心
售票官网: http://unite2018.csdn.net/ 或者直接扫描下图二维码进行购票!
点击“阅读原文”获取更多技术文章 !